﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace ConfigLession
{
    internal class XMLHelper
    {
        //定义了一个字符串变量 xmlPath，用于存储 XML 文件的路径。
        string xmlPath = @"..\..\XMLFILE.xml";

        /// <summary>
        /// 获取所有自定义节点
        /// </summary>
        /// <param name="sectionName">>被选择的根节点，这里是serial</param>
        /// <returns></returns>
        public string[] ReadMySection(string sectionName)
        {
            List<string> ele = new List<string>();
            //创建对象，用于加载和解析 XML 文件
            XmlDocument xmlDocument = new XmlDocument();
            //使用 Load 方法加载指定路径的 XML 文件到 xmlDataDocument 对象中。
            xmlDocument.Load(xmlPath);
            //使用 SelectSingleNode 方法选择 XML 文档中的根节点。 （这里是获取到ccc节点下的根节点serial）
            XmlNode rootXml = xmlDocument.SelectSingleNode("ccc/" + sectionName); 
            //获取serial根节点下的所有子节点
            XmlNodeList xmlNodeList = rootXml.ChildNodes;
            //遍历所有子节点中的值，并且赋值给List对象
            for (int i = 0; i < xmlNodeList.Count; i++) 
            {
                ele.Add(xmlNodeList[i].Name);
            }
            return ele.ToArray();
        }

        /// <summary>
        /// 获取指定节点数据
        /// </summary>
        /// <param name="sectionName">被选择的根节点，这里是serial</param>
        /// <param name="key">对应的key值</param>
        /// <returns></returns>
        public string ReadMyNode(string sectionName,string key)
        {
            string value = ""; //返回值
            //创建对象，用于加载和解析 XML 文件
            XmlDocument xmlDocument = new XmlDocument();
            //使用 Load 方法加载指定路径的 XML 文件到 xmlDataDocument 对象中。
            xmlDocument.Load(xmlPath);
            //使用 SelectSingleNode 方法选择 XML 文档中的节点。
            XmlNode rootXml = xmlDocument.SelectSingleNode("ccc/" + sectionName);  //找到根节点
            //获取serial根节点下的所有子节点
            XmlNodeList xmlNodeList = rootXml.ChildNodes;  //找到所有子节点，进行遍历
            foreach (var item in xmlNodeList) 
            { 
                XmlElement xmlElement = (XmlElement)item; //获取XMLElement元素
                if (xmlElement.Name == key) //如果传递过来的key和xlmElement的name一致
                {
                    value = xmlElement.InnerText; //获取xlmElement里面的值
                }
            }
            return value;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sectionName">serial</param>
        /// <param name="key"></param>
        /// <returns></returns>
        public string ReadMyNode1(string sectionName, string key)
        {
            string value = ""; //返回值
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(xmlPath);

            XmlNode rootXml = xmlDocument.SelectSingleNode("ccc/" + sectionName);  //找到根节点

            value = (rootXml.SelectSingleNode(key)).InnerText; //获取xlmElement里面的值
            return value;
        }

        /// <summary>
        /// 修改指定节点数据
        /// </summary>
        /// <param name="sectionName">被选择的根节点，这里是serial</param>
        /// <param name="key">对应的key值</param>
        /// <param name="value">修改后的数据</param>
        /// <returns></returns>
        public string WriteMyNode(string sectionName, string key,string value)
        {
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(xmlPath);
            XmlNode rootXml = xmlDocument.SelectSingleNode("ccc/" + sectionName);  //找到根节点
            XmlNodeList xmlNodeList = rootXml.ChildNodes;  //找到所有子节点，进行遍历
            foreach (var item in xmlNodeList)
            {
                XmlElement xmlElement = (XmlElement)item;
                if (xmlElement.Name == key)
                {
                   xmlElement.InnerText = value; //修改后的数据
                }
            }
            xmlDocument.Save(xmlPath);  //保存（路径）
            return value;
        }

        /// <summary>
        /// 删除指定节点数据
        /// </summary>
        /// <param name="sectionName"></param>
        /// <returns></returns>
        public void DelMyNode(string sectionName, string key)
        {
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(xmlPath);
            XmlNode rootXml = xmlDocument.SelectSingleNode("ccc/" + sectionName);  //找到根节点
            var delNode = xmlDocument.SelectSingleNode("ccc/" + sectionName + "/" + key); //获取指定的那个节点
            rootXml.RemoveChild(delNode); //删除指定节点
            xmlDocument.Save(xmlPath);  //保存（路径）
        }

        /// <summary>
        /// 增加指定节点数据
        /// </summary>
        /// <param name="sectionName">被选择的根节点</param>
        /// <param name="key">对应的key值</param>
        /// <param name="value">要添加的值</param>
        /// <returns></returns>
        public void AddMyNode(string sectionName, string key, string value)
        {
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(xmlPath);
            XmlNode rootXml = xmlDocument.SelectSingleNode("ccc/" + sectionName);  //找到根节点
            // 创建新的节点
            XmlElement newNode = xmlDocument.CreateElement(key);
            newNode.InnerText = value;
            //将新节点添加到根节点下
            rootXml.AppendChild(newNode);
            xmlDocument.Save(xmlPath);  //保存（路径）
        }

    }
}
